package tianhao.luo.hashtab;

/**
 *
 * 链表
 *
 * @author: tianhao.luo@hand-china.com 2021/6/21  下午11:02
 */
public class EmpLinkedList {
    /**
     * 链表的头指针,直接指向第一个Emp
     */
    private Emp head;


    /**
     * 添加雇员到链表
     *
     * 1.假定,当添加雇员时,id是自增长,即id的分配总是从小到大
     *   因此我们将该雇员直接加入到本链表的最后即可
     *
     * @param emp 添加的元素
     */
    public void add(Emp emp){
        // 添加的是第一个元素
        if (head == null){
            head = emp;
            return;
        }

        // 添加的不是第一个元素,加入到链表结尾
        Emp temp = head;
        // 找到末尾的元素
        while (temp.next != null){
            // 后移元素
            temp = temp.next;
        }
        // 添加元素
        temp.next = emp;
    }

    /**
     * 遍历链表中的雇员信息
     * @param no 链表索引
     */
    public void list(int no){
        if (head == null){
            System.out.println("第"+(no+1)+"条链表为空");
            return;
        }
        System.out.print("第"+(no+1)+"条链表信息");
        // 打印所有元素
        Emp temp = head;
        while (temp.next != null){
            System.out.printf("=> id=%d name=%s \t",temp.id,temp.name);
            temp = temp.next;
        }
        System.out.printf("=>最后一个元素 id=%d name=%s \t",temp.id,temp.name);
        System.out.println();
    }

    /**
     * 根据id查找员工
     * @return 员工
     */
    public Emp findEmpByList(int id){
        // 判断链表是否为空
        if (head == null){
            System.out.println("链表为空");
            return null;
        }

        // 辅助指针
        Emp temp = head;
        while (true){
            if (temp.id == id){
                break;
            }
            // 说明当前链表中没有找到该元素
            if (temp.next == null){
                temp = null;
                break;
            }
            temp = temp.next;
        }

        return temp;
    }


    /**
     * 返回删除的节点元素
     * @param id 员工id
     * @return 删除的元素
     */
    public Emp delete(int id){
        // 判断链表是否为空
        if (head == null){
            System.out.println("链表为空");
            return null;
        }

        // 辅助指针
        Emp temp = head;
        while (true){
            // 删除的是头结点
            if (temp.id == id){
                head = temp.next;
                return temp;
            }
            if (temp.next == null){
                // 已经走到了链表末尾
                break;
            }
            // 删除的其他节点
            if (temp.next.id == id){
                // temp表示上一个节点,temp.next表示删除的节点
                Emp delete = temp.next;
                temp.next = temp.next.next;
                return delete;
            }
            temp = temp.next;
        }
        return null;
    }
}
